/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.bo;

import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.indicadores.dao.ValorDadoPrimarioDAO;
import br.uniceub.fsw.indicadores.dao.IndicadorDAO;
import br.uniceub.fsw.indicadores.dao.DadoPrimarioDAO;
import br.uniceub.fsw.indicadores.vo.ValorDadoPrimarioVO;
import br.uniceub.fsw.indicadores.vo.DadoPrimarioVO;
import java.util.List;

/**
 * Business Object da entidade DadoPrimario. Essa classe é responsável por todos as
 * funcionalidades de negócio relacionadas à entidade.
 * 
 @author Marcos Mello Nobrega Soares ra2013617/8
 */
public class DadoPrimarioBO {

    DadoPrimarioDAO dadoPrimarioDAO = new DadoPrimarioDAO();
    
    /**
     * Valida se om registro de dado primário está pronto para inserção ou atualização.
     * 
     * @param dadoPrimario dado primário a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o dado primário 
     * informado não possua condições de ser inserido ou atualizado no banco de dados.
     */
    public void validaDadoPrimario(DadoPrimarioVO dadoPrimario) throws Exception, NegocioException {
        
        String mensagem = new String();
        
        if(dadoPrimario.getCdIndicador() == null || dadoPrimario.getCdIndicador() == 0) {
            mensagem = mensagem.concat("Indicador relacionado não informado.<br />");
        }
        if(dadoPrimario.getNoDadoPrimario() == null || dadoPrimario.getNoDadoPrimario().equals("")) {
            mensagem = mensagem.concat("Nome do dado primário obrigatório.\n");
        }
        
        if(dadoPrimario.getDsDadoPrimario() == null || dadoPrimario.getDsDadoPrimario().equals("")) {
            mensagem = mensagem.concat("Descrição do dado primário obrigatória.\n");
        }
        if(dadoPrimario.getNoDadoPrimario() != null && !dadoPrimario.getNoDadoPrimario().isEmpty()) {
            try {  
                validarVOUnico(dadoPrimario);
            }
            catch(NegocioException e) {
                mensagem = mensagem.concat(e.getMessage());
            }
            catch(Exception e) {
                throw new Exception(e.getMessage());
            }
        }
        
        if(!mensagem.isEmpty())
            throw new NegocioException(mensagem);
    }
    
    /**
     * Valida se já existe um registro de dado primário no Banco de Dados como verificação para inserção.
     * 
     * @param dadoPrimario dado primário a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o dado primário 
     * informado não possua nome para a verificação ou não já exista um DadoPrimario com o mesmo nome no banco de dados.
     */
    public void validarVOUnico(DadoPrimarioVO dadoPrimario) throws Exception, NegocioException {
        
        if(dadoPrimario.getNoDadoPrimario() == null || dadoPrimario.getNoDadoPrimario().isEmpty())
            throw new Exception("Nome do dado primário não foi informado.");
        
        if(dadoPrimario.getCdIndicador() == null || new IndicadorDAO().consultarPorId(dadoPrimario.getCdIndicador()) == null)
            throw new Exception("Indicador do Dado primário não existe ou não foi informado");
        
        DadoPrimarioVO dadoPrimarioExemplo = new DadoPrimarioVO();
        List<DadoPrimarioVO> lista;
        
        dadoPrimarioExemplo.setNoDadoPrimario(dadoPrimario.getNoDadoPrimario());
        lista = dadoPrimarioDAO.consultarPorExemplo(dadoPrimarioExemplo);
        
        if(!lista.isEmpty())
            if(dadoPrimario.getIdDadoPrimario() == null || (dadoPrimario.getIdDadoPrimario() != null && !lista.get(0).getIdDadoPrimario().equals(dadoPrimario.getIdDadoPrimario())))
                throw new NegocioException("Já existe um dado primário para este indicador com nome \"" + dadoPrimario.getNoDadoPrimario() +
                 "\" na base de dados.");
    }
    
    /**
     * Verifica se o dado primário está associado a valores de dado primário. Se positivo,
     * o dado primário não pode ser excluído.
     * 
     * @param dadoPrimario dado primário a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o dado primário 
     * esteja associado a um valor de dado primário.
     */
    public void validaExclusao(DadoPrimarioVO dadoPrimario) throws Exception, NegocioException {
    
        if(dadoPrimario.getIdDadoPrimario() == null)
            throw new Exception("Dado primário não foi informado.");
        
        ValorDadoPrimarioVO valorDadoPrimarioExemplo = new ValorDadoPrimarioVO();
        valorDadoPrimarioExemplo.setCdDadoPrimario(dadoPrimario.getIdDadoPrimario());
       
        List<ValorDadoPrimarioVO> vdp = new ValorDadoPrimarioDAO().consultarPorExemplo(valorDadoPrimarioExemplo);        
                
        if(vdp.size() > 0) 
             throw new NegocioException("O dado primário não pode ser excluído " +
                     "pois está associado a um valor.");
        
    }
    
    /**
     * Verifica se o dado primário está associado a valores de dado primário. Se positivo,
     * a medição já foi iniciada e consequentemente o dado primário não pode ser alterado.
     * 
     * @@param dadoPrimario dado primário a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o dado primário 
     * esteja associado a um valor de dado primário.
     */
    public void validaAlteracao(DadoPrimarioVO dadoPrimario) throws Exception, NegocioException {
    
        try {
            validaExclusao(dadoPrimario);
        }
        catch (NegocioException e) {            
             throw new NegocioException("O dado primário não pode ser alterado " +
                     "pois está associado a um valor.");        
        }
    }
}
